package org.geekbang.thinking.in.spring.bean.definition;

import org.geekbang.thinking.in.spring.ioc.overview.domain.User;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.GenericBeanDefinition;

/**
 * {@link org.springframework.beans.factory.config.BeanDefinition} 构建示例
 *
 */
public class BeanDefinitionCreationDemo {

    public static void main(String[] args) {
        // 1、通过 BeanDefinitionBuilder
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
        // 通过属性设置
        builder.addPropertyValue("id", 100L);
        builder.addPropertyValue("name", "汪思齐");
        // 获取 BeanDefinition 实例
        BeanDefinition beanDefinition = builder.getBeanDefinition();
        // BeanDefinition 并非 Bean 的终态，可以自定义修改


        // 2、通过 AbstractBeanDefinition 派生类
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        // 设置类型
        genericBeanDefinition.setBeanClass(User.class);
        MutablePropertyValues propertyValues = new MutablePropertyValues();
        // propertyValues.addPropertyValue("id", 101);
        // propertyValues.addPropertyValue("name", "汪思齐");
        propertyValues.add("id", 101).addPropertyValue("name", "汪思齐");
        genericBeanDefinition.setPropertyValues(propertyValues);
    }

}
